﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MoroMoro.Samples.ToDoList.Application;
using MoroMoro.Samples.ToDoList.Domain.ToDos;
using MoroMoro.Samples.ToDoList.Domain.Categories;

namespace MoroMoro.Samples.ToDoList.Presentation.Views
{
    /// <summary>
    /// ToDoList ビューです。
    /// </summary>
    public interface IToDoListView : IView
    {
        /// <summary>
        /// 状態フィルタが変更されると発生します。
        /// </summary>
        event EventHandler StateComboBoxSelectedIndexChanged;

        /// <summary>
        /// カテゴリフィルタが変更されると発生します。
        /// </summary>
        event EventHandler CategoryComboBoxSelectedIndexChanged;


        /// <summary>
        /// ToDo 作成ボタンがクリックされると発生します。
        /// </summary>
        event EventHandler CreationButtonClick;

        /// <summary>
        /// ToDo 編集ボタンがクリックされると発生します。
        /// </summary>
        event EventHandler EditionButtonClick;

        /// <summary>
        /// ToDo 削除ボタンがクリックされると発生します。
        /// </summary>
        event EventHandler DeletionButtonClick;


        /// <summary>
        /// ToDo を着手に進めるボタンがクリックされると発生します。
        /// </summary>
        event EventHandler ForwadToTouchedButtonClick;

        /// <summary>
        /// ToDo を完了に進めるボタンがクリックされると発生します。
        /// </summary>
        event EventHandler ForwadToCompletedButtonClick;

        /// <summary>
        /// ToDo を未着手に戻すボタンがクリックされると発生します。
        /// </summary>
        event EventHandler ReversionToUntouchedButtonClick;

        /// <summary>
        /// ToDo を着手に戻すボタンがクリックされると発生します。
        /// </summary>
        event EventHandler ReversionToTouchedButtonClick;


        /// <summary>
        /// カテゴリ作成ボタンがクリックされると発生します。
        /// </summary>
        event EventHandler CategoryCreationButtonClick;

        /// <summary>
        /// カテゴリ編集ボタンがクリックされると発生します。
        /// </summary>
        event EventHandler CategoryEditionButtonClick;

        /// <summary>
        /// カテゴリ削除ボタンがクリックされると発生します。
        /// </summary>
        event EventHandler CategoryDeletionButtonClick;


        /// <summary>
        /// 現在選択状態になっている ToDo の一覧を取得します。
        /// </summary>
        IEnumerable<ToDo> CheckedItems
        {
            get;
        }

        /// <summary>
        /// 状態フィルタを取得または設定します。
        /// </summary>
        ToDoState? SelectedStateFilter
        {
            get;
            set;
        }

        /// <summary>
        /// カテゴリフィルタを取得または設定します。
        /// </summary>
        Category SelectedCategory
        {
            get;
            set;
        }


        /// <summary>
        /// 状態フィルタに状態の一覧をバインドします。
        /// </summary>
        /// <param name="dataSource">状態の一覧。</param>
        /// <param name="valueMember">データソース内の値のメンバー名。</param>
        /// <param name="displayMember">データソース内の表示用テキストのメンバー名。</param>
        void BindStateFilter(object dataSource, string valueMember, string displayMember);

        /// <summary>
        /// カテゴリフィルタにカテゴリの一覧をバインドします。
        /// </summary>
        /// <param name="dataSource">カテゴリの一覧。</param>
        /// <param name="valueMember">データソース内の値のメンバー名。</param>
        /// <param name="displayMember">データソース内の表示用テキストのメンバー名。</param>
        void BindCategories(object dataSource, string valueMember, string displayMember);


        /// <summary>
        /// ToDo 一覧を表示します。
        /// </summary>
        /// <param name="items">ToDo 一覧。</param>
        void ShowItems(IList<ToDo> items);

        /// <summary>
        /// ToDo 一覧をクリアします。
        /// </summary>
        void ClearItems();


        /// <summary>
        /// ToDo 作成ビューを表示します。
        /// </summary>
        /// <param name="facade">ファサード。</param>
        void ShowCreationView(ToDoListFacade facade);

        /// <summary>
        /// ToDo 編集ビューを表示します。
        /// </summary>
        /// <param name="facade">ファサード。</param>
        /// <param name="target">編集対象の ToDo。</param>
        void ShowEditionForm(ToDoListFacade facade, ToDo target);

        /// <summary>
        /// カテゴリ作成ビューを表示します。
        /// </summary>
        /// <param name="facade">ファサード。</param>
        void ShowCategoryCreationForm(ToDoListFacade facade);

        /// <summary>
        /// カテゴリ編集ビューを表示します。
        /// </summary>
        /// <param name="facade">ファサード。</param>
        /// <param name="target">編集対象のカテゴリ。</param>
        void ShowCategoryEditionForm(ToDoListFacade facade, Category target);
    }
}
